High performance electronic systems such as those used for computer network servers and mass storage applications often feature a number of physically separate buses that allow a greater number of peripheral devices such as network interface controllers and disk controllers to be part of the system. A bridge combines the two buses into one logical bus, so that a device on one bus can readily communicate with a device on the other bus through the bridge. Communication between two devices on opposite sides of the bridge occurs as follows. A device known as the initiator presents a request for a write or read transaction on an initiating bus. The request specifies the address of a target device on a target bus on the opposite side of the bridge. The bridge which is coupled between the initiating and target buses has been previously configured to recognize such a request.
A two part transaction occurs when the bridge claims the request on the initiating bus, and subsequently transports the transaction onto the target bus. For instance, with a posted write transaction, the bridge accepts a write data packet from the initiator, and then signals a termination to disconnect the initiator and end the transaction on the initiating side. The data packet is temporarily stored in a data queue of the bridge. When the bridge thereafter acquires the target bus in a new transaction, the data packet is forwarded from the queue to the target. In systems that comply with the popular Peripheral Component Interconnect (PCI) Local Bus Specification, Rev. 2.1, Jun. 1, 1995, the posted write transaction is normally a write to memory or a memory-mapped location. For further information on such transactions, the reader is referred to the i960.RTM. Rx I/O Microprocessor Developer's Manual, April 1997, Intel Corp. Order No. 272736-002, chapter 15, PCI-to-PCI bridge unit.
Typically, conventional PCI bridges have been designed so that only a single posted write transaction, in a given direction through the bridge, can be pending in the bridge. Such bridges are used in a variety of different system applications that may have different data traffic patterns. For instance, in a network server application, the bridge is faced with the task of forwarding a large number of data packets from one bus to another, where each data packet may be relatively small. On the other hand, a mass storage application generates much larger packets but less frequently.
The conventional PCI bridge is often optimized at the design stage to more effectively handle a particular system application by engineering the size of its data queue. Optimizing at the design stage creates a problem, however, because it requires a number of different bridge designs each being specifically optimized for a dedicated system application, thus substantially increasing the cost of manufacturing bridges. Therefore, what is needed is a universal design that allows a bridge to dynamically adapt to changes in data traffic encountered in different system applications. Such a design should also make efficient use of the bridge's data queue, because the queue is a high speed and silicon-intensive realization and is therefore a relatively expensive component of the bridge.